#!/usr/bin/env Rscript

library(tidyverse)
library(lubridate)

categories_mode <- function(x) {
    summarize (x,
               cnae_secao = names(which.max(table(cnae_secao))),
               ds_natureza_lesao = names(which.max(table(ds_natureza_lesao))),
               cbo_grande_grupo = names(which.max(table(cbo_grande_grupo))),
               agrupamento_parte_do_corpo = names(which.max(table(agrupamento_parte_do_corpo))),
               ds_grupo_agcausadores = names(which.max(table(ds_grupo_agcausadores))),
               ds_tipo_acidente = names(which.max(table(ds_tipo_acidente))),
               ds_tipo_local_acidente = names(which.max(table(ds_tipo_local_acidente))),
               turno = names(which.max(table(turno)))
               )
}

#count occurrences of each category in a collumn and spread it
# TODO make passing column name work!
#spread_occurrences <- function(x, y) {
#    x %>%
#    group_by(pais, regiao, uf, mesorregiao, microrregiao, municipio) %>%
#    count(y) %>%
#    spread(y, n, fill = 0)
#}

cnaes <- read_csv2("../app/data/cnae_organizado.csv")
cbos <- read_csv2("../app/data/cbo_organizado.csv")
partes_do_corpo <- read_csv2("../app/data/parte_do_corpo_organizado.csv")
agente_causador <- read_csv2("../app/data/agente_causador_organizado.csv")
complete <- read_csv2("../app/data/completo.csv", na = c("NA", "", "Não informado"),
                      col_types = cols(
                          pais = col_character(),
                          regiao = col_character(),
                          uf = col_character(),
                          mesorregiao = col_character(),
                          microrregiao = col_character(),
                          municipio = col_character(),
                          st_acidente_feriado = col_character(),
                          ds_agente_causador = col_character(),
                          ano_cat = col_integer(),
                          ds_cnae_classe_cat = col_character(),
                          dt_acidente = col_date(),
                          st_dia_semana_acidente = col_character(),
                          ds_emitente_cat = col_character(),
                          hora_acidente = col_time(),
                          idade_cat = col_integer(),
                          cd_indica_obito = col_character(),
                          ds_natureza_lesao = col_character(),
                          ds_cbo = col_character(),
                          ds_parte_corpo_atingida = col_character(),
                          cd_tipo_sexo_empregado_cat = col_character(),
                          ds_tipo_acidente = col_character(),
                          ds_tipo_local_acidente = col_character()
                      ))

# Remove unnecessary columns
complete <- complete[-c(7, 9, 11, 12)]
complete <- drop_na(complete)

# Change absolute hour to "shifts"
complete <- complete %>% mutate(turno = case_when(
                                    hora_acidente >= hm("06:00") & hora_acidente  < hm("18:00") ~ "Diurno",
                                    TRUE ~ "Noturno"))

# Remove absolute hour
complete <- complete[-10]

# Group CNAES in higher hierarchy
complete <- complete %>% inner_join(cnaes, by = "ds_cnae_classe_cat")
complete <- complete %>% inner_join(cbos, by = "ds_cbo")
complete <- complete %>% inner_join(partes_do_corpo, by = "ds_parte_corpo_atingida")
complete <- complete %>% inner_join(agente_causador, by = "ds_agente_causador")

#remove old classification
complete <- complete[-c(7,8,13,14)]

#this data is necessary for the parallel sets
parset_data <- sample_n(complete, 100000) #99% confidence level and 2% margin of error requires 4139
parset_data <- parset_data %>% mutate(idade_cat = case_when(
                                          idade_cat >= 0 & idade_cat  < 14 ~ "< 14",
                                          idade_cat >= 14 & idade_cat  <= 23 ~ "14-23",
                                          idade_cat >= 24 & idade_cat  <= 33 ~ "24-33",
                                          idade_cat >= 34 & idade_cat  <= 43 ~ "34-43",
                                          idade_cat >= 44 & idade_cat  <= 53 ~ "44-53",
                                          idade_cat >= 54 & idade_cat  <= 63 ~ "54-63",
                                          idade_cat >= 64 & idade_cat  <= 73 ~ "64-73",
                                          TRUE ~ ">= 74"))

names(parset_data) <- c("pais", "regiao", "uf", "mesorregiao", "microrregiao",
                        "municipio", "emitente", "idade", "obito",
                        "natureza_lesao", "sexo", "tipo_acidente",
                        "local_acidente", "turno", "CNAE", "CBO", "parte_corpo",
                        "ag_causador")

parset_data <- parset_data %>% mutate(natureza_lesao = tolower(natureza_lesao),
                                      local_acidente = tolower(local_acidente),
                                      CNAE = tolower(CNAE),
                                      CBO = tolower(CBO),
                                      ag_causador = tolower(ag_causador))

parset_data <- parset_data %>% select(pais, regiao, uf, mesorregiao, microrregiao,
                                      municipio, sexo, CNAE, CBO, ag_causador,
                                      natureza_lesao, parte_corpo, tipo_acidente,
                                      local_acidente, idade, turno, emitente, obito)

write_delim(parset_data, "../app/data/parset_data.csv", delim = ";")

# Go back to projections part
# Temporary: seems emitente is not necessary so remove it
complete <- complete[-7]

# Summarize with mode to colour the data
categories <- group_by(complete, regiao, uf, mesorregiao, microrregiao, municipio) %>%
    categories_mode() %>%
    arrange(regiao, uf, mesorregiao, microrregiao, municipio)
saveRDS(categories, "../app/data/rds/categories.rds")

# This is ugly, we really need that function
d <- complete %>%
    group_by(pais, regiao, uf, mesorregiao, microrregiao, municipio) %>%
    count(ds_natureza_lesao) %>%
    mutate(n = (round(n / sum(n), 4))) %>%
    spread(ds_natureza_lesao, n, fill = 0)

d2 <- complete %>%
    group_by(pais, regiao, uf, mesorregiao, microrregiao, municipio) %>%
    count(ds_tipo_acidente) %>%
    mutate(n = (round(n / sum(n), 4))) %>%
    spread(ds_tipo_acidente, n, fill = 0)

d3 <- complete %>%
    group_by(pais, regiao, uf, mesorregiao, microrregiao, municipio) %>%
    count(ds_tipo_local_acidente) %>%
    mutate(n = (round(n / sum(n), 4))) %>%
    spread(ds_tipo_local_acidente, n, fill = 0)

d4 <- complete %>%
    group_by(pais, regiao, uf, mesorregiao, microrregiao, municipio) %>%
    count(cnae_secao) %>%
    mutate(n = (round(n / sum(n), 4))) %>%
    spread(cnae_secao, n, fill = 0)

d5 <- complete %>%
    group_by(pais, regiao, uf, mesorregiao, microrregiao, municipio) %>%
    count(cbo_grande_grupo) %>%
    mutate(n = (round(n / sum(n), 4))) %>%
    spread(cbo_grande_grupo, n, fill = 0)

d6 <- complete %>%
    group_by(pais, regiao, uf, mesorregiao, microrregiao, municipio) %>%
    count(agrupamento_parte_do_corpo) %>%
    mutate(n = (round(n / sum(n), 4))) %>%
    spread(agrupamento_parte_do_corpo, n, fill = 0)

d7 <- complete %>%
    group_by(pais, regiao, uf, mesorregiao, microrregiao, municipio) %>%
    count(ds_grupo_agcausadores) %>%
    mutate(n = (round(n / sum(n), 4))) %>%
    spread(ds_grupo_agcausadores, n, fill = 0)

#extra 'd' for the other fields we need
d8 <- complete %>%
    group_by(pais, regiao, uf, mesorregiao, microrregiao, municipio) %>%
    summarize(
        idade = mean(idade_cat),
        obito = sum(cd_indica_obito == "N")/(n()),
        sexo = sum(cd_tipo_sexo_empregado_cat == "Masculino")/(n()),
        turno = sum(turno == "Diurno")/(n())
    )

complete <- d %>%
    inner_join(d2, by = c("pais", "regiao", "uf", "mesorregiao", "microrregiao", "municipio")) %>%
    inner_join(d3, by = c("pais", "regiao", "uf", "mesorregiao", "microrregiao", "municipio")) %>%
    inner_join(d4, by = c("pais", "regiao", "uf", "mesorregiao", "microrregiao", "municipio")) %>%
    inner_join(d5, by = c("pais", "regiao", "uf", "mesorregiao", "microrregiao", "municipio")) %>%
    inner_join(d6, by = c("pais", "regiao", "uf", "mesorregiao", "microrregiao", "municipio")) %>%
    inner_join(d7, by = c("pais", "regiao", "uf", "mesorregiao", "microrregiao", "municipio")) %>%
    inner_join(d8, by = c("pais", "regiao", "uf", "mesorregiao", "microrregiao", "municipio")) %>%
    arrange(regiao, uf, mesorregiao, microrregiao, municipio)

write_delim(complete, "../app/data/proj/projection_data.csv", delim = ";")
